﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CityGames
{
    public partial class FormEmpleadosGestion : Form
    {
        static private FormContenedor contenedor;
        static private Empleado empleado = new Empleado();
        static private TipoEmpleado tipoEmpleado = new TipoEmpleado();
        private const int numeroDeEmpleadosPorPagina = 13;
        private int numeroDePaginaActual;
        private int numeroDePaginasMaximo;

        public DataSet dsEmpleados;

        public FormEmpleadosGestion()
        {
            InitializeComponent();
        }

        private void FormEmpleadosGestion_Load(object sender, EventArgs e)
        {
            try
            {
                contenedor = (FormContenedor)MdiParent;

                numeroDePaginaActual = 1;

                cbTipo.Items.Add("Todos");
                foreach (DataRow row in tipoEmpleado.ObtenerTipoEmpleado().Rows)
                {
                    cbTipo.Items.Add(row[0].ToString());
                }
                cbTipo.SelectedItem = cbTipo.Items[0];

                MostrarTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han producido los siguientes errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bBorrar_Click(object sender, EventArgs e)
        {
            bool correcto = true;

            try
            {
                if (dgvFiltroEmpleados.SelectedRows.Count > 0)
                {
                    if (MessageBox.Show("¿Realmente desea eliminar los empleados seleccionados?", "Confirmar eliminar", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                    {
                        foreach (DataGridViewRow row in dgvFiltroEmpleados.SelectedRows)
                        {
                            if (!BorrarEmpleado(dsEmpleados.Tables["EmpleadosFiltrados"].Rows[row.Index]["Dni"].ToString()))
                            {
                                correcto = false;
                            }
                        }

                        if (correcto)
                        {
                            CargarDataGridViewFiltroEmpleados();
                            MessageBox.Show(" Empleado(s) eliminado(s) correctamente.    ", "Eliminación exitosa.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        else
                        {
                            MessageBox.Show("Ocurrió un error durante la eliminación.    ", "Eliminación fallida.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Debe seleccionar al menos un empleado.    ", "Seleccionar empleados para eliminar.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public bool BorrarEmpleado(string dni)
        {
            bool resultado = false;

            try
            {
                resultado = empleado.BorrarEmpleado(dni);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }

        private void bEditar_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgvFiltroEmpleados.SelectedRows.Count == 1)
                {
                    contenedor.hijoFormEmpleadosAlta.ModificarDatos(dsEmpleados.Tables["EmpleadosFiltrados"].Rows[dgvFiltroEmpleados.SelectedRows[0].Index]);
                    contenedor.hijoFormEmpleadosAlta.Focus();
                }
                else
                {
                    MessageBox.Show("Debe seleccionar un empleado.    ", "Seleccione un empleado.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bMostrar_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgvFiltroEmpleados.SelectedRows.Count == 1)
                {
                    contenedor.hijoFormEmpleadosAlta.VisualizarDatos(dsEmpleados.Tables["EmpleadosFiltrados"].Rows[dgvFiltroEmpleados.SelectedRows[0].Index]);
                    contenedor.hijoFormEmpleadosAlta.Focus();
                }
                else
                {
                    MessageBox.Show("Debe seleccionar un empleado.    ", "Seleccione un empleado.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bFiltrar_Click(object sender, EventArgs e)
        {
            try
            {
                FiltrarEmpleados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void FiltrarEmpleados()
        {
            try
            {
                tbNombre.Text = "";
                tbNombre.Focus();
                tbApellidos.Text = "";
                tbApellidos.Focus();
                tbDni.Text = "";
                tbDni.Focus();
                rbSexo1.Checked = false;
                rbSexo2.Checked = false;
                rbAmbos.Checked = true;
                cbTipo.SelectedItem = cbTipo.Items[0];

                numeroDePaginaActual = 1;

                CargarDataGridViewFiltroEmpleados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void CargarDataGridViewFiltroEmpleados()
        {
            try
            {
                string sexo = "";
                if (rbSexo1.Checked)
                    sexo = "Hombre";
                else if (rbSexo2.Checked)
                    sexo = "Mujer";
                else
                    sexo = "";

                numeroDePaginasMaximo = int.Parse(Math.Ceiling(double.Parse(empleado.ObtenerNumeroDeEmpleadosFiltrados(tbNombre.Text, tbApellidos.Text, tbDni.Text, sexo, cbTipo.Text).ToString()) / numeroDeEmpleadosPorPagina).ToString());
                if (numeroDePaginaActual > numeroDePaginasMaximo)
                    numeroDePaginaActual = numeroDePaginasMaximo;

                dsEmpleados = empleado.ObtenerEmpleadosFiltrados(tbNombre.Text, tbApellidos.Text, tbDni.Text, sexo, cbTipo.Text, numeroDeEmpleadosPorPagina * (numeroDePaginaActual - 1), numeroDePaginaActual * numeroDeEmpleadosPorPagina);
                dgvFiltroEmpleados.DataSource = dsEmpleados;
                dgvFiltroEmpleados.DataMember = "EmpleadosFiltrados";
                lbPaginaDGV.Text = "Página " + numeroDePaginaActual.ToString() + " de " + numeroDePaginasMaximo.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tbNombre_TextChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewFiltroEmpleados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tbApellidos_TextChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewFiltroEmpleados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tbDni_TextChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewFiltroEmpleados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void cbTipo_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewFiltroEmpleados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void rbSexo1_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewFiltroEmpleados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void rbSexo2_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewFiltroEmpleados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVUltimaPagina_Click(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = numeroDePaginasMaximo;
                CargarDataGridViewFiltroEmpleados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVPaginaSiguiente_Click(object sender, EventArgs e)
        {
            try
            {
                if (numeroDePaginaActual < numeroDePaginasMaximo)
                {
                    numeroDePaginaActual++;
                    CargarDataGridViewFiltroEmpleados();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVPaginaAnterior_Click(object sender, EventArgs e)
        {
            try
            {
                if (numeroDePaginaActual > 1)
                {
                    numeroDePaginaActual--;
                    CargarDataGridViewFiltroEmpleados();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVPrimeraPagina_Click(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewFiltroEmpleados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void ModificarDatos(DataRow datos)
        {
            try
            {
                dsEmpleados.Tables["EmpleadosFiltrados"].Rows[dgvFiltroEmpleados.SelectedRows[0].Index]["Nombre"] = datos["Nombre"];
                dsEmpleados.Tables["EmpleadosFiltrados"].Rows[dgvFiltroEmpleados.SelectedRows[0].Index]["Apellidos"] = datos["Apellidos"];
                dsEmpleados.Tables["EmpleadosFiltrados"].Rows[dgvFiltroEmpleados.SelectedRows[0].Index]["Dni"] = datos["Dni"];
                dsEmpleados.Tables["EmpleadosFiltrados"].Rows[dgvFiltroEmpleados.SelectedRows[0].Index]["Telefono"] = datos["Telefono"];
                dsEmpleados.Tables["EmpleadosFiltrados"].Rows[dgvFiltroEmpleados.SelectedRows[0].Index]["E_mail"] = datos["E_mail"];
                dsEmpleados.Tables["EmpleadosFiltrados"].Rows[dgvFiltroEmpleados.SelectedRows[0].Index]["Password"] = datos["Password"];
                dsEmpleados.Tables["EmpleadosFiltrados"].Rows[dgvFiltroEmpleados.SelectedRows[0].Index]["Tipo"] = datos["Tipo"];
                dsEmpleados.Tables["EmpleadosFiltrados"].Rows[dgvFiltroEmpleados.SelectedRows[0].Index]["Sexo"] = datos["Sexo"];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public bool ActualizarEmpleados()
        {
            bool resultado = false;

            try
            {
                string sexo;

                if (rbSexo1.Checked)
                    sexo = "Hombre";
                else if (rbSexo2.Checked)
                    sexo = "Mujer";
                else
                    sexo = "";
               
                resultado = empleado.ActualizarEmpleado(dsEmpleados, tbNombre.Text, tbApellidos.Text, tbDni.Text, sexo, cbTipo.Text, numeroDeEmpleadosPorPagina * (numeroDePaginaActual - 1), numeroDePaginaActual * numeroDeEmpleadosPorPagina);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return resultado;
        }

        public void MostrarTodos()
        {
            try
            {
                tbNombre.Text = "";
                tbNombre.Focus();
                tbApellidos.Text = "";
                tbDni.Text = "";
                rbSexo1.Checked = false;
                rbSexo2.Checked = false;
                rbAmbos.Checked = true;
                cbTipo.SelectedItem = cbTipo.Items[0];

                numeroDePaginaActual = 1;

                CargarDataGridViewFiltroEmpleados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        public bool UpdateEmpleado(DataRow dr)
        {
            bool resultado = false;

            try
            {
                resultado = empleado.UpdateEmpleado(dr);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }

        private void lbPaginaDGV_Click(object sender, EventArgs e)
        {

        }
    }
}